package modules::Victorina;

use DBI;
use encoding "utf8";
use utf8;
use Switch;
use locale;

my $total = 0;
sub new {
   my $self = {};
   $total++;
   $глоб_конф->{nomer_igry}=1;
   return bless $self;
   }

sub gettotal {return $total;}

sub init {$глоб_конф = \%$modules::victorina::глоб_конфа;
          $название_конфы = $modules::victorina::глоб_конфа;}

sub init_victorina {
# Установка изначальных данных
$pkg = shift;
if ($ctl_igr<1) {
	$глоб_конф->{nomer_igry}=1; # Флаг начала игры (1 - задается очередной вопрос)
	$pkg->{ctl_ozh}=10; # Ожидание бота до выдачи следующей подсказки, в секундах.
	$nomer_bazy="2"; # Номер таблицы с вопросами
	$num_base_flag=0; # Флаг выбора таблицы с вопросами (1 - выбрана таблица)

	&_dbi_connect;
        $nazv_bazy = "var$nomer_bazy";
        $sql = "SELECT
	            num,
	            vopros,
	            otvet
	            FROM
	            $nazv_bazy";
        $sth = $dbh->prepare($sql);
        $sth->execute();
        $rv = $sth->rows;
        $sth->finish;
        $dbh->disconnect();
        $ctl_igr = 1;
}
return $pkg;
}

# Подключение к базе
sub _dbi_connect {
   $dbh = DBI->connect("DBI:mysql:$::db_victorina:$::db_host:$::db_port", $::db_user, $::db_password);
   $dbh->do("SET NAMES utf8");
}

sub vybor_voprosa {
# Выборка случайного вопроса
my ($pkg,$название_конфы,$адрес_конфы) = @_;
      if ($глоб_конф->{nomer_igry} == 1) {
	&_dbi_connect;
        $prov_tabl = $dbh->do("SHOW TABLES LIKE '$название_конфы'");
      if ($prov_tabl == 1) {
        $sql = "SELECT
                    id,
                    igrok,
                    ball
                    FROM
                    $название_конфы";
        $sth = $dbh->prepare($sql);
        $sth->execute();
        $sth->bind_columns(\$id, \$igrok, \$ball);
        $глоб_конф->{usercount} = {};
        while ($sth->fetch()) {
        utf8::decode($igrok);
        $глоб_конф->{usercount}->{$igrok}=$ball;
        }
        $sth->finish;
        } else {
        $sql = "CREATE TABLE $название_конфы (
        `id` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
        `igrok` VARCHAR( 127 ) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
        `ball` INT( 11 ) NOT NULL DEFAULT '0',
        KEY `id` ( `id` ) ,
        FULLTEXT KEY `igrok` ( `igrok` ) 
        ) ENGINE = MYISAM DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;";
        $sth = $dbh->prepare($sql);
        $sth->execute();
        $sth->finish;
        }

        $sluchayn = int(rand($rv));
        $sql = "SELECT
	            num,
	            vopros,
	            otvet
	            FROM
	            $nazv_bazy
                    WHERE
                    num='$sluchayn'";
        $sth = $dbh->prepare($sql);
        $sth->execute();
        $sth->bind_columns(\$num, \$vopros, \$otvet);
        $sth->fetch();

        utf8::decode($vopros);
        utf8::decode($otvet);
        $pkg->{ctl_vopros} = $vopros;
        $pkg->{ctl_otvet} = $otvet;

        $sth->finish;
        $dbh->disconnect();
        
        if ($num_base_flag==1) {$messaga_plus = "Выбрана база $nomer_bazy с числом вопросов $rv\n";}
	$pkg->{ctl_vopros} =~ tr/ехаос/exaoc/; # Защита от читеров
        $messaga .=  "$messaga_plus"."Внимание, вопрос:\n$pkg->{ctl_vopros}";
        $ctl_time=time; # Системное время в секундах с 1.1.1970
        $глоб_конф->{ctl_bukv}=0; # Индекс массива для очередной открывающейся буквы в подсказке
        $глоб_конф->{nomer_igry}=0; # Флаг начала игры (0 - не задавать очередной вопрос)
        $глоб_конф->{буквы} = '';
        undef $messaga_plus;
        $глоб_конф->{ctl_time} = time;
        &soobschenie(from => "$адрес_конфы");
}
return $pkg;
}

sub otvet_sovpal {
# Ответ совпал. Добавление балла игроку. Флаг нового вопроса.
$pkg = shift;
my $otvet_uch = shift;
my $ctl_otvet = shift;
my $ник_игрока = shift;
my $адрес_конфы = shift;
if ($ctl_otvet eq $otvet_uch && $ник_игрока !~ / $/) {
        utf8::decode($ник_игрока);
	$глоб_конф->{usercount}->{$ник_игрока}++;
	$messaga = "$ник_игрока, ты правильно ответил, это \"$ctl_otvet\". Получаешь 1 балл. Твой счет становится: $глоб_конф->{usercount}->{$ник_игрока} баллов\n";
	$глоб_конф->{nomer_igry} = 1;
        $глоб_конф->{ctl_bukv} = 0;

	&_dbi_connect;
        if ($глоб_конф->{usercount}->{$ник_игрока} == 1) {
        $sql = "INSERT INTO
		          $название_конфы
		         (igrok,ball)
		          VALUES
		         ('$ник_игрока','$глоб_конф->{usercount}->{$ник_игрока}')";
} else {
        $sql = "UPDATE
		          $название_конфы
		    SET
		          igrok='$ник_игрока',
		          ball='$глоб_конф->{usercount}->{$ник_игрока}'
		    WHERE
		          igrok LIKE '$ник_игрока'";
}
        $dbh->do($sql);
        $dbh->disconnect();
        &vybor_voprosa($pkg,$название_конфы,$адрес_конфы);
}
return $глоб_конф->{usercount};
}

sub admin_tools {
# Команды администраторов
my ($pkg,%args) = @_;
my (@words_vi) = split(/ /,$args{body});
my $kluch = "$args{from}/$args{resource}";
@infaonike = split(/\//,$::spisokjidov{$kluch});
print "Инфа о нике: $infaonike[2]\n";
if ($infaonike[2] eq 'owner' || $infaonike[2] eq 'admin') {
        switch ($words_vi[0]) {
         case "сл"       { $глоб_конф->{nomer_igry}=1;}
	 case "ожидание" { $pkg->{ctl_ozh}=$words_vi[1];}
         case "старт"    { $pkg->{ctl_igry}=1;}
         case "стоп"     { $pkg->{ctl_igry}=0;}
         }
}
return $pkg;
}

sub schet {
# Счет игрока
	$nick=undef;
	my ($pkg,%args) = @_;
	my (@words_vi) = split(/ /,$args{body});
	$args{body} =~ s/$words_vi[0] //;
	$args{body} =~ s/\s+$//;
	$nick = $args{body};
utf8::decode($args{resource});
utf8::decode($nick);
        $schetchik_scheta=0;
        for (reverse sort { $глоб_конф->{usercount}->{$a} <=> $глоб_конф->{usercount}->{$b} } keys %{$глоб_конф->{usercount}}) {
           $schetchik_scheta++;
           $mesto{$_} = $schetchik_scheta;
        }
	if ($#words_vi > 0 && $глоб_конф->{usercount}->{$nick} ne "") {
        $messaga = "$args{resource}: у $nick $глоб_конф->{usercount}->{$nick} баллов и он(а) занимает $mesto{$nick} место.";
        } elsif ($#words_vi == 0 && $глоб_конф->{usercount}->{$args{resource}} ne "") {
	$messaga = "$args{resource}: у тебя $глоб_конф->{usercount}->{$args{resource}} баллов и ты на $mesto{$args{resource}} месте.";
        } elsif ($#words_vi > 0) {
	$messaga = "$args{resource}: у $nick 0 баллов.";
        } else {
	$messaga = "$args{resource}: у тебя 0 баллов.";
        }
	&soobschenie(from => "$args{from}");	
}

sub povtor {
# Повтор вопроса
my ($pkg,$ctl_vopros,$from,$resource) = @_;
	$messaga = "$resource, повторяю специально для тебя:\n$ctl_vopros";
	&soobschenie(from => "$from");	
}

sub top {
# Десятка игроков с наибольшими баллами
shift;
my $адрес_конфы = shift;
	$messaga = "\n";
        $s=0;
        for (reverse sort { $глоб_конф->{usercount}->{$a} <=> $глоб_конф->{usercount}->{$b} } keys %{$глоб_конф->{usercount}}) {
        if ($s<10) {
	$s++;
        utf8::decode($_);
        $messaga .= "$s)$_ = $глоб_конф->{usercount}->{$_} баллов\n";
        }
        }
	&soobschenie(from => "$адрес_конфы");
}

sub podskazka {
# Подсказка
    $pkg = shift;
    my $конт_время=time;
    my $конфа = $название_конфы;
    ${$конфа.'ожидание'} = shift;
    my $адрес_конфы = shift;
if ("@_" ne ${$конфа.'фраза'}) {
    ${$конфа.'счетчик'} = 1;
    @{$конфа.'буквы'} = ();
}
    ${$конфа.'фраза'} = "@_";
if ($конт_время>=$глоб_конф->{ctl_time}+${$конфа.'ожидание'} 
    && $глоб_конф->{nomer_igry}==0) {
	unless (@{$конфа.'буквы'}) {
		${$конфа.'ктл_фраза'} = ${$конфа.'фраза'};
		@{$конфа.'буквы'} = split (//,${$конфа.'фраза'});
        ${$конфа.'кол_букв'} = @{$конфа.'буквы'};
        ${$конфа.'ктл_фраза'} =~ s/\w/*/g;
	}

    if (${$конфа.'счетчик'}<${$конфа.'кол_букв'}) {
        ${$конфа.'буква'} = shift (@{$конфа.'буквы'});
	    if (${$конфа.'буква'} =~ /\w/) {
	       ${$конфа.'ктл_фраза'} =~ s/\*/${$конфа.'буква'}/;
	       $глоб_конф->{ctl_time}=$конт_время;
	       $messaga = "Подсказка: \"${$конфа.'ктл_фраза'}\"";
	       &soobschenie(from => "$адрес_конфы");
               ${$конфа.'счетчик'}++;
	    }
    } elsif (${$конфа.'счетчик'}==${$конфа.'кол_букв'}) {
    	$messaga = "Подсказки исчерпаны, вы проиграли. Правильный ответ \"${$конфа.'фраза'}\"\n";
	    ${$конфа.'счетчик'} = 1;
	    @{$конфа.'буквы'} = ();
	    $глоб_конф->{nomer_igry} = 1;
	    &vybor_voprosa($pkg,$название_конфы,$адрес_конфы);
    }
}

}



sub soobschenie {
# Сообщение бота в конфу
my (%args) = @_;
   main::SendMessage(to => $args{from}, type => 'groupchat', body => "$messaga");
   undef $messaga;
}

1;